package TestExercises07;

//多线程练习4(抢红包)

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;

//方法二
/*
抢红包也用到了多线程。
假设:100块，分成了3个包，现在有5个人去抢。
其中，红包是共享数据。
5个人是5条线程。
打印结果如下:
      XXX抢到了XXX元
      XXX抢到了XXX元
      XXX抢到了XXX元
      XXX没抢到
      XXX没抢到
 */
public class Test04case2 {
    public static void main(String[] args) {

        //创建线程对象
        MyThread044 t1 = new MyThread044();
        MyThread044 t2 = new MyThread044();
        MyThread044 t3 = new MyThread044();
        MyThread044 t4 = new MyThread044();
        MyThread044 t5 = new MyThread044();

        //设置线程名字
        t1.setName("线程1");
        t2.setName("线程2");
        t3.setName("线程3");
        t4.setName("线程4");
        t5.setName("线程5");

        //开启线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

class MyThread044 extends Thread {

    //共享数据：100块分3个包

    //总金额
    static BigDecimal money = BigDecimal.valueOf(100.0);

    //个数
    static int count = 3;

    //最小的中奖金额
    static final BigDecimal MIN = BigDecimal.valueOf(0.01);

    @Override
    public void run() {
        //同步代码块
        synchronized (MyThread044.class) {
            if (count == 0) {
                //判断，共享数据是否到了末尾（已经到末尾）
                System.out.println(getName() + "没有抢到红包");
            } else {
                //判断，共享数据是否已经到了末尾（没有到末尾）
                //中奖金额
                BigDecimal prize;
                if (count == 1) {
                    prize = money;
                } else {
                    //获取抽奖范围
                    double bounds = money.subtract(BigDecimal.valueOf(count - 1).multiply(MIN)).doubleValue();
                    Random r = new Random();
                    //抽奖金额
                    prize = BigDecimal.valueOf(r.nextDouble(bounds));
                }
                //设置抽中红包，小数点保留两位，四舍五入
                prize = prize.setScale(2, RoundingMode.HALF_UP);
                //从money中去掉对应的的钱
                money = money.subtract(prize);
                //红包个数减1
                count--;
                //本次红包的信息进行打印
                System.out.println(getName() + "抢到了" + prize + "元");
            }
        }
    }
}
